package main

import (
	"fmt"
	"time"
)

/**
 * 定义一个channel，进行通信，通过特殊值通知消费者goroutine停止等待。
 */
// main函数是程序的入口点。
func main() {
	// 创建一个缓冲大小为10的整型通道，用于生产者和消费者之间的通信。
	messages := make(chan int, 10)

	// 使用defer确保在main函数退出时关闭messages通道。
	defer close(messages)

	// 启动一个goroutine作为消费者处理messages通道中的消息。
	go func() {
		// 创建一个定时器，每隔一秒触发一次。
		ticker := time.NewTicker(time.Second)
		// 使用range遍历ticker的通道，每隔一秒检查是否有消息需要处理。
		for _ = range ticker.C {
			// 使用select语句监听messages通道。
			select {
			// 默认情况下，尝试从messages通道接收并打印消息。
			default:
				// 尝试从messages通道接收消息
				msg, ok := <-messages
				if !ok {
					// 如果通道关闭，退出goroutine。
					fmt.Println("child process interrupt……")
					return
				}
				if msg == -1 {
					// 如果接收到特殊值-1，退出goroutine。
					fmt.Println("child process interrupt……")
					return
				}
				// 打印接收到的消息
				fmt.Printf("send message: %d\n", msg)
			}
		}
	}()

	// 主协程作为生产者，向messages通道发送0到9的整数。
	for i := 0; i < 10; i++ {
		messages <- i
	}

	// 主协程休眠5秒，以确保消费者有足够的时间处理所有消息。
	time.Sleep(15 * time.Second)

	// 发送特殊值-1到messages通道，通知消费者goroutine停止等待。
	messages <- -1

	// 再次休眠1秒，确保消费者goroutine有时间响应停止通知并退出。
	time.Sleep(1 * time.Second)

	// 打印主协程退出的消息。
	fmt.Println("main process exit!")
}
